package com.gxa.zhonglong.controller;

import com.gxa.zhonglong.common.JsonResult;
import com.gxa.zhonglong.exception.BusinessException;
import lombok.extern.log4j.Log4j2;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

/**
 * 本质上,就是一个aop的通知,专门用于加强异常出现的时候的抛出通知
 * @author bill
 * @date 2021/10/21 15:20
 */
@RestController
@ControllerAdvice
@Log4j2
public class ExceptionController {
    /**
     * 当有异常发生,抛出通知介入到目标操作
     * 并把异常对象注入到参数Exception中
     * value 表示什么类型的错误或异常才会被处理
     * 我们选择使用Throwable.class(Error和Exception都要记录)
     */
    @ExceptionHandler(Throwable.class)
    public Map<String,Object> handler(Exception e) {
        e.printStackTrace();

        //分割线方便阅读
        log.info("-----------------begin-----------------------");
        // 先记录异常对象的toString状态: 包括异常类型和异常原因
        log.info(e);

        // 再遍历栈中的异常轨迹: 采用遍历方式
        StackTraceElement[] stackTrace = e.getStackTrace();
        for (StackTraceElement stackTraceElement : stackTrace) {
            log.info(stackTraceElement);
        }
        //分割线方便阅读
        log.info("-------------------end---------------------");
        JsonResult jsonResult = new JsonResult();
        jsonResult.setCode("500");
        jsonResult.setMsg("系统繁忙,请稍后再试!");
        if (e instanceof BusinessException) {
            jsonResult.setCode(((BusinessException) e).getCode());
            jsonResult.setMsg(e.getMessage());
        }
        return jsonResult.getDataMap();
    }
}
